(clear)

;plantilla para las preguntas/respuestas del formulario
(deftemplate preguntas
	(slot precio (type INTEGER) (default 13000))
	(slot maletero (allowed-values pequeno mediano grande) (default grande))
	(slot caballos (type INTEGER) (default 80))
	(slot ABS (allowed-values no si) (default si))
	(slot consumo (type FLOAT) (default 8.0))
)

;plantilla para los diferentes modelos de automvil
(deftemplate automovil
	(slot modelo)
	(slot precio (type INTEGER))
	(slot maletero (allowed-values pequeno mediano grande))
	(slot caballos (type INTEGER))
	(slot ABS (allowed-values no si))
	(slot consumo (type FLOAT))
)	

;hechos iniciales
(deffacts initial-fact
	(automovil (modelo modelo1) (precio 12000) (maletero pequeno) (caballos 65) (ABS no) (consumo 4.7))
	(automovil (modelo modelo2) (precio 12500) (maletero pequeno) (caballos 80) (ABS si) (consumo 4.9))
	(automovil (modelo modelo3) (precio 13000) (maletero mediano) (caballos 100) (ABS si) (consumo 7.8))
	(automovil (modelo modelo4) (precio 14000) (maletero grande) (caballos 125) (ABS si) (consumo 6.0))
	(automovil (modelo modelo5) (precio 15000) (maletero pequeno) (caballos 147) (ABS si) (consumo 8.5))
	(preguntas (precio 15000) (maletero pequeno) (caballos 60) (ABS si) (consumo 9.0))
)

(reset)

;regla para hallar los modelos de automovil con precio optimo
(defrule evaluaPrecio
	(preguntas (precio ?pp))
	(automovil (modelo ?m) (precio ?pa))
	(test (<= ?pa ?pp))
=>
	(assert (optimoPrecio ?m))
)

;regla para hallar los modelos de automovil con maletero optimo
(defrule evaluaMaletero
	(preguntas (maletero ?mp))
	(automovil (modelo ?m) (maletero ?ma))
	(test (eq ?mp ?ma))
=>
	(assert (optimoMaletero ?m))
)

;regla para hallar los modelos de automovil con caballos optimos
(defrule evaluaCaballos
	(preguntas (caballos ?pp))
	(automovil (modelo ?m) (caballos ?pa))
	(test (>= ?pa ?pp))
=>
	(assert (optimoCaballos ?m))
)

;regla para hallar los modelos de automovil con ABS optimo
(defrule evaluaABS
	(preguntas (ABS ?mp))
	(automovil (modelo ?m) (ABS ?ma))
	(test (eq ?mp ?ma))
=>
	(assert (optimoABS ?m))
)

;regla para hallar los modelos de automovil con consumo optimo
(defrule evaluaConsumo
	(preguntas (consumo ?pp))
	(automovil (modelo ?m) (consumo ?pa))
	(test (<= ?pa ?pp))
=>
	(assert (optimoConsumo ?m))
)

;regla para recomendar automoviles cuyas caracteristicas sean optimas
(defrule evaluaOptimo
	(optimoPrecio ?m)
	(optimoMaletero ?m)
	(optimoCaballos ?m)
	(optimoABS ?m)
	(optimoConsumo ?m)
=>
	(printout t "El modelo mas adecuado a sus necesidades es " ?m crlf)
)
